// 线性表-顺序表
#ifndef SQ_LIST
#define SQ_LIST
#define MAX_SIZE 10000

typedef char ElemType;

typedef struct
{
	ElemType elem[MAX_SIZE]; // 线性表元素
	int length;				 // 当前长度
	int listSize;			 // 顺序表所占空间
} SqList;

/**
 * 创建一个线性表
 * @param list 传入空的线性表引用
 */
void initList(SqList &);

/**
 * 判断线性表是否为空
 * @param list 传入的线性表引用
 * @return 是否为空
 */
int listEmpty(SqList &);

/**
 * 返回线性表长度
 * @param list 传入的线性表引用
 * @return 线性表长度
 */
int listLength(SqList &);

/**
 * 获取线性表的某个元素
 * @param list 传入线性表引用
 * @param i 要取得的元素索引
 * @return 线性表元素
 */
ElemType getElem(SqList &, int);

/**
 * 获取某个元素在线性表中的索引
 * @param list 传入线性表引用
 * @param e 要取得索引的元素
 * @return 元素索引，-1代表未找到元素
 */
int locateElem(SqList &, ElemType);

/**
 * 返回线性表某个元素的前一个元素
 * @param list 传入线性表引用
 * @param e 当前元素
 * @return e的前一个元素
 */
ElemType priorElem(SqList &, ElemType);

/**
 * 返回线性表某个元素的后一个元素
 * @param list 传入线性表引用
 * @param e 当前元素
 * @return e的后一个元素
 */
ElemType nextElem(SqList &, ElemType);

/**
 * 在指定位置插入一个元素
 * @param list 传入线性表引用
 * @param i 插入位置（索引）
 * @param e 插入的元素
 */
void listInsert(SqList &, int, ElemType);

/**
 * 删除指定位置的元素
 * @param list 传入线性表引用
 * @param i 要删除的元素位置
 * @return 返回被删除的元素
 */
ElemType listDelete(SqList &, int);

/**
 * 对列表中每个元素传入visit函数并调用
 * @param list 传入列表引用
 * @param visit(ElemType&) 回调函数
 */
void listTraverse(SqList &, void(ElemType &));

/**
 * 交换顺序表中两个元素位置
 * @param list 顺序表
 * @param i 第一个要交换的元素索引
 * @param j 第二个要交换的元素索引
 */
void swap(SqList &, int, int);

#include "./sq-list.cpp"

#endif